【小ネタ】GuardDuty 通知は Security Hub 経由で行うとリージョン集約ができて便利
Security Hub にはリージョン集約機能がある
AWS Security Hub は セキュリティサービスです。 主に以下 2つの主要機能を持ちます。
- [セキュリティイベント集中管理] 様々なセキュリティサービスで発生するイベントを集中管理する
- [クラウドセキュリティポスチャー管理] AWS上の構成を評価して潜在的なセキュリティリスクを発見する
そんな Security Hub に最近 リージョン集約機能 が実装されました。
Security Hubで管理するセキュリティイベント(検出結果)を 特定のリージョン(集約リージョン) へ集約できる機能です。
例えば Security Hub を全リージョンで有効化している場合に、 この機能を使うことで集約リージョンでのみ通知設定を入れるだけで、 全リージョン分の通知を実現できます。
GuardDutyの通知設定も集約しよう
GuardDutyは Security Hub にデフォルトで統合されています。 GuardDuty で出てきた検出結果は、 Security Hub 側でも管理されます。
つまり、Security Hub のリージョン集約機能を使えば GuardDutyの検出結果も (Security Hub経由で) 特定リージョンへ集約できます。 通知設定も集約リージョンのみで済みます。楽ちん。
作ってみる
前提として GuardDutyを有効化させるリージョンでは Security Hub も有効化しておきましょう。 そして Security Hub のリージョン集約設定を適用させておきましょう。 (やり方は アップデートブログ を参照ください)
ルール設定
まずは集約リージョンにて以下リソースを作ります。
- EventBridgeルール
- SNSトピック
EventBridgeルールのイベントパターンは以下のようなJSONです。 Security Hub 経由である点に注意。
{ "source": ["aws.securityhub"], "detail-type": ["Security Hub Findings - Imported"], "detail": { "findings": { "ProductName": ["GuardDuty"], "Severity": { "Label": ["LOW", "MEDIUM", "HIGH", "CRITICAL"] } } } }
(参考) これらリソースは CloudFormation テンプレートで作りました
AWSTemplateFormatVersion: '2010-09-09' Parameters: Prefix: Type: String Severities: Type: CommaDelimitedList Default: "LOW,MEDIUM,HIGH,CRITICAL" Resources: # EventBridge Rule EventBridgeRule: Type: AWS::Events::Rule Properties: Name: !Sub "${Prefix}-guardduty-finding-rule" EventPattern: "source": ["aws.securityhub"] "detail-type": ["Security Hub Findings - Imported"] "detail": "findings": "ProductName": ["GuardDuty"] "Severity": "Label": !Ref Severities Targets: - Arn: !Ref SnsTopic Id: sns-topic # SNS Topic SnsTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub "${Prefix}-guardduty-topic" # SNS Topic Policy EventTopicPolicy: Type: AWS::SNS::TopicPolicy Properties: PolicyDocument: Statement: - Effect: "Allow" Principal: Service: "events.amazonaws.com" Action: "sns:Publish" Resource: "*" Topics: - !Ref SnsTopic
通知設定
作成した SNSトピックへサブスクライブさせて通知設定を行います。 今回は AWS Chatbot を使いました。
試してみる
東京リージョン
で先程のルール設定、通知設定を構築しています。
その状態で バージニア北部リージョン
の GuardDutyの [設定 > 結果のサンプル] にて
検出結果サンプルを生成してみます。(※注意: 100個近く検出結果が作られます)
しばらくすると Slackに(大量の)通知が飛んできました。
バージニア北部リージョン(us-east-1)
の検出結果であることがわかります。
おわりに
投稿時点では GuardDuty はリージョン集約に対応していないです。 なので複数リージョンの通知をカバーしたい場合は、 Security Hub 経由で行うのが一番楽でしょう。